在使用 Docker 之前需要先簡單的了解一些基本的概念,這樣會比較容易上手。
今天就來介紹 Docker的底層實作技術、Docker的系統架構、一些常看到的名詞,這幾個部份。
一. Docker 底層實作技術
Docker 的底層是使用 Linux Kernel的 Namespace 和 Cgroup 組合而成的。因此在安裝 Docker 之前要先確認 Linux Kernel的版本是否有支援被 Docker 使用。以下就分別來簡單介紹 Namespace 和 Cgroup
Namespace:用來做環境隔離使用的,像是把Process ID、User ID、Network…等等的環境執行狀態隔離開來。舉個例子來說在一台實體機器上,有 2個 Namespace,Namespace 1 和 Namepsace2。Namespace 1 裡面的 PID 有 1,Namespace 2的PID 也可以有 1 的 PID,這樣就做到執行環境上PID 的隔離。如下圖:
Cgroup:用來做系統資源的管理,如:CPU、Memory、I/O…等等,資源做有效的隔離和做使用上的限制。
有了 Namespace 和 Cgroup 後,就可以做到在同一個 Kernel的系統環境下,有效的隔離資源的使用。
二. Docker 系統架構
Docker 的系統的架構主要是 Client-Server 的架構,Client 的部份稱為 Docker Client,然後 Server 的部份稱為 Docker Daemon,介紹如下:
Docker Daemon:用來執行管理 Docker image、啟動 container、停止 container 的 service,它是一個 long time service。並且有提供 Restful API 給使用者做操作或是顯示一些 Docker container 的狀態訊息。在 Docker 1.11 之後將 Docker Daemo 的元件拆分為 containerd、docker-containerd-shim、docker-runc… 等等的元件。因為這有點的複雜,所以對 Docker 底層想要再做進一步研究的人,可以上網查詢這些元件的關鍵字。
Docker Client: 使用 Restful API 連到 Docker daemon,並且提供 command line 的方式讓使用者可以操作 docker。
三. 使用 Docker常看到的名詞介紹
上圖是一個 Docker image 堆積出來大概的示意圖,在寫 Dockerfile 時會比較有感覺。
Docker Image 要從哪裡來?
Docker container 和 Docker container 之間的環境是隔離開離來的,不會發生 container1 開 8080 的 port,container2 開 8080 的 port 有衝到的問題。
可以使用網路上公開的 Docker Hub,或是在自已的內部環境下架設一個私有的Docker Hub 又被稱為 Docker Registry。
以上介紹到 Docker image、Docker Container、Docker Hub 在未來 30 天都會看到。